import 'package:http/http.dart' as Http;
import 'dart:convert';
import 'dart:convert' show utf8, json;

httpDemo() async {
  print('-----------  http start  ---------------');
  /**
   * 向目标主机发送一次get请求
   * 自动创建临时Client，请求结束后自动删除
   * 如果要对主机发送多个请求，要手动new Client
   *
   * var client = new Client();
   * client.get(...)
   * client.put(...)
   *
   * 其他请求有：post put patch delete
   * 返回值为Future<Response>
   *
   * Http请求有可能返回Response，或者异常
   */
  String url = "http://localhost:3333/userInfo";
  Http.Response response = await Http.get(url);

  /**
   * 获取标签头字段的名称，并遍历输出
   * 获取标签头某个字段的值
   */
  response.headers.keys.forEach((str) => print(str));
  print("content-type = ${response.headers['content-type']}\n");

  /**
   * 获取响应对象的主体内容
   * Response.bodyBytes返回字节List
   *
   * Response.body返回String
   * 但仍然是通过对bodyBytes进行编码来实现
   * 调用Response.body的时候，默认以content-type的字段值来进行编码
   * 比如content-type = text/html; charset=utf-8，则采用UTF8进行编码
   *
   * 如果源码有无效的字符
   * 那么直接调用Response.body的时候出错，会显示错误：
   * FormatException: Bad UTF-8 encoding 0xfd
   * 那么我们就需要手动对字节进行编码
   * 设置allowMalformed为true，对无效或未完成的字符进行替换
   */
  List<int> bytes = response.bodyBytes;

  String utf8Body = utf8.decode(bytes, allowMalformed: true); // .substring(0, 800);
  print(utf8Body + "\n");
  print(json.decode(utf8Body)['code']);

  /**
   * read和readBytes作用为向主机发送get请求，但不返回Response
   * 返回值为Future<String>和Future<Uint8List>
   */
  print((await Http.read(url)));

  /**
   * 设置请求的标签头
   * 通过修改User-Agent来模拟iPhone 6请求
   * 显示手机版百度首页
   *
   * 可以对比之前read的字符串
   */
  Http.get(url,
      headers: {'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X) AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1'}).then((resp) {
    print(resp.body);
  });

}
